GtkTreeView: Avoid overlapping sort indicator
authorMatthias Clasen <mclasen@redhat.com>
Thu, 10 Jul 2014 18:13:35 +0000 (14:13 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 10 Jul 2014 18:22:59 +0000 (14:22 -0400)
Hide the sort indicator when it would overlap the column title.

gtk/gtktreeviewcolumn.c

index 87fc72b4ae30577fda58ff65907aed34c22cb37e..af8d0b477e41ec45dab913f05c9a82319018dde6 100644 (file)
@@ -818,6 +818,33 @@ gtk_tree_view_column_cell_layout_get_area (GtkCellLayout   *cell_layout)
 
 /* Button handling code
  */
+static void
+maybe_hide_arrow (GtkWidget         *arrow,
+                  GtkAllocation     *allocation,
+                  GtkTreeViewColumn *col)
+{
+  GtkAllocation a;
+  gboolean overlap;
+
+  gtk_widget_get_allocation (col->priv->alignment, &a);
+
+  /* resizable columns can be shrunk all the way; in that case
+   * we don't want to render the sort indicator on top of the
+   * label, but just hide it.
+   */
+  if ((a.x <= allocation->x && allocation->x < a.x + a.width) ||
+      (allocation->x <= a.x && a.x < allocation->x + allocation->width))
+    overlap = TRUE;
+  else
+    overlap = FALSE;
+
+  if (col->priv->show_sort_indicator && !overlap)
+    gtk_widget_set_opacity (arrow, 1);
+  else
+    gtk_widget_set_opacity (arrow, 0);
+}
+
+
 static void
 gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column)
 {
@@ -878,6 +905,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
   gtk_container_add (GTK_CONTAINER (priv->alignment), child);
   gtk_container_add (GTK_CONTAINER (priv->button), hbox);
 
+  g_signal_connect (priv->arrow, "size-allocate",
+                    G_CALLBACK (maybe_hide_arrow), tree_column);
+
   gtk_widget_show (hbox);
   gtk_widget_show (priv->alignment);
   gtk_tree_view_column_update_button (tree_column);